/************************************************************
* @file   uart_defines.h
************************************************************/

#ifndef UART_DEFINES_H
#define UART_DEFINES_H

#include "gkt_board.h"
#include "gkt_driver.h"
#include "gkt_defines.h"
#include "gkt_gpio.h"

#ifdef GKT_CONFIG_UART_DEVNUMS
#if !GKT_CONFIG_UART_DEVNUMS || (GKT_CONFIG_UART_DEVNUMS > GKT_UART_MAXNUMS)
#error "macro GKT_CONFIG_UART_DEVNUMS invalid!"
#endif
#define UART_DEVNUMS	GKT_CONFIG_UART_DEVNUMS
#else
#define UART_DEVNUMS	GKT_UART_MAXNUMS
#endif


#define UART_XON_CH		0x11
#define UART_XOFF_CH	0x13
#define UART_BUSY_TIMEOUT	1000000



/* UART attrs */
typedef struct _uart_attr {
	gkt_device_base_attr_s	base_attr;

#ifndef GKT_UART_BAUDRATE_MIN
	uint32_t	baudrate_min;
#endif
#ifndef GKT_UART_BAUDRATE_MAX
	uint32_t	baudrate_max;
#endif

#ifndef GKT_UART_FIFO_DEPTH
	uint16_t	fifo_depth;
#endif

#ifndef GKT_UART_DLF_WIDTH
	uint8_t	dlf_width;
#endif
} uart_attr_s;

#ifndef GKT_UART_BAUDRATE_MIN
#define UART_BAUDRATE_MIN_DEFINE(dev_id)	\
	.baudrate_min = GKT_UART##dev_id##_BAUDRATE_MIN,
#else
#define UART_BAUDRATE_MIN_DEFINE(dev_id)
#endif

#ifndef GKT_UART_BAUDRATE_MAX
#define UART_BAUDRATE_MAX_DEFINE(dev_id)	\
	.baudrate_max = GKT_UART##dev_id##_BAUDRATE_MAX,
#else
#define UART_BAUDRATE_MAX_DEFINE(dev_id)
#endif

#ifndef GKT_UART_FIFO_DEPTH
#define UART_ATTR_FIFO_DEPTH_DEFINE(dev_id)	\
	.fifo_depth = GKT_UART##dev_id##_FIFO_DEPTH,
#else
#define UART_ATTR_FIFO_DEPTH_DEFINE(dev_id)
#endif

#ifndef GKT_UART_DLF_WIDTH
#define UART_ATTR_DLF_WIDTH_DEFINE(dev_id)	\
	.dlf_width = GKT_UART##dev_id##_DLF_WIDTH,
#else
#define UART_ATTR_DLF_WIDTH_DEFINE(dev_id)
#endif

#define UART_ATTR_DEFINE(dev_id)	\
	{	\
		.base_attr = GKT_DEVICE_BASE_ATTR(UART, dev_id),	\
		UART_BAUDRATE_MIN_DEFINE(dev_id)	\
		UART_BAUDRATE_MAX_DEFINE(dev_id)	\
		UART_ATTR_FIFO_DEPTH_DEFINE(dev_id)	\
		UART_ATTR_DLF_WIDTH_DEFINE(dev_id)	\
	}
#define UART_ATTRS_DEFINE	GKT_DEVICE_ATTRS_DEFINE(UART, uart)
GKT_DEVICE_ATTRS_DECLARE(uart);

/* base attr */
#define UART_BASEADDR(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).base_attr.base_addr
#define UART_IRQNO(dev_id)		GKT_DEVICE_ATTR(uart, dev_id).base_attr.irq_no
#define UART_IRQPRIO(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).base_attr.irq_priority


/* baudrate */
#ifndef GKT_UART_BAUDRATE_MIN
#define UART_BAUDRATE_MIN(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).baudrate_min
#else
#define UART_BAUDRATE_MIN(dev_id)	GKT_UART_BAUDRATE_MIN
#endif

#ifndef GKT_UART_BAUDRATE_MAX
#define UART_BAUDRATE_MAX(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).baudrate_max
#else
#define UART_BAUDRATE_MAX(dev_id)	GKT_UART_BAUDRATE_MAX
#endif

/* features */
#ifndef GKT_UART_FIFO_DEPTH
#define UART_FIFO_DEPTH(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).fifo_depth
#else
#define UART_FIFO_DEPTH(dev_id)	GKT_UART_FIFO_DEPTH
#endif

#ifndef GKT_UART_DLF_WIDTH
#define UART_DLF_WIDTH(dev_id)	GKT_DEVICE_ATTR(uart, dev_id).dlf_width
#else
#define UART_DLF_WIDTH(dev_id)	GKT_UART_DLF_WIDTH
#endif

#endif	/* UART_DEFINES_H */

